package br.com.toscano.contpedido.view;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.imageio.ImageIO;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;

import br.com.toscano.contpedido.business.ClienteBC;
import br.com.toscano.contpedido.business.PedidoBC;
import br.com.toscano.contpedido.business.ProdutoBC;
import br.com.toscano.contpedido.business.StatusPedidoBC;
import br.com.toscano.contpedido.business.UsuarioBC;
import br.com.toscano.contpedido.constant.ConstantesMensagem;
import br.com.toscano.contpedido.domain.Cliente;
import br.com.toscano.contpedido.domain.ContextoUsuario;
import br.com.toscano.contpedido.domain.ObjetoAbstrato;
import br.com.toscano.contpedido.domain.Pedido;
import br.com.toscano.contpedido.domain.PedidoProduto;
import br.com.toscano.contpedido.domain.Perfil;
import br.com.toscano.contpedido.domain.Produto;
import br.com.toscano.contpedido.domain.StatusPedido;
import br.com.toscano.contpedido.domain.Usuario;
import br.com.toscano.contpedido.util.PdfUtils;
import br.com.toscano.contpedido.util.Util;
import br.com.toscano.contpedido.view.converter.DateConverter;
import br.com.toscano.contpedido.view.filter.ConfiguracaoFilter;
import br.com.toscano.contpedido.view.servlet.ExibeRecebimentoServlet;
import br.gov.frameworkdemoiselle.annotation.NextView;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractListPageBean;
import br.gov.frameworkdemoiselle.util.ResourceBundle;

import com.itextpdf.text.DocumentException;


@ViewController
@NextView("./pedido_edit.jsf")
@PreviousView("./pedido_list.jsf")
public class PedidoListMB extends AbstractListPageBean<Pedido, Long> {

	private static final long serialVersionUID = 1L;
	
	public static final Byte TIPO_PAGAMENTO_TODOS = 2;

	@Inject
	private PedidoBC pedidoBC;
	
	private Long idPedido;
	private Date dataCadastroInicial;
	private Date dataCadastroFinal;
	private Date dataEntregaInicial;
	private Date dataEntregaFinal;
	private Byte tipoPagamento = TIPO_PAGAMENTO_TODOS;

	private boolean filtrar = false;

	public Long getIdPedido() {
		if(idPedido == null && FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("idPedidos") != null && FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("idPedidos") instanceof Long) {
			idPedido = (Long) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("idPedidos");
		}
		return idPedido;
	}

	public void setIdPedido(Long id) {
		this.idPedido = id;
	}


	@Inject
	private UsuarioBC usuarioBC;
	private List<SelectItem> usuarios;
	private Long usuario;

	public List<SelectItem> getUsuarios() {
		usuarios = new ArrayList<SelectItem>();
		boolean admin = false;
		ContextoUsuario usuario = (ContextoUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ConstantesMensagem.CONTEXTO_USUARIO_SESSAO);
		if (usuario != null) {
			for (Perfil perfil :usuario.getUsuario().getListaPerfil()) {
				if (perfil.getId().equals(Perfil.PERFIL_ADM)){
					admin = true;
				}
			}
			
		}
		if (admin) {
			List<Usuario> lista = usuarioBC.findAll();
			for (Usuario obj: lista) {
				usuarios.add(new SelectItem(obj.getId() , obj.getNome()));
			}
		} else {
			usuarios.add(new SelectItem(usuario.getUsuario().getId() , usuario.getUsuario().getNome()));
		}
		return usuarios;
	}

	public void setUsuarios(List<SelectItem> usuarios) {
		this.usuarios = usuarios;
	}

	public Long getUsuario() {
		return usuario;
	}

	public void setUsuario(Long usuario) {
		this.usuario = usuario;
	}


	@Inject
	private ProdutoBC produtoBC;
	private List<SelectItem> produtos;
	private Long produto;

	@Inject
	private StatusPedidoBC statusPedidoBC;
	private List<SelectItem> statusPedidos;

	public List<SelectItem> getStatusPedidos() {
		statusPedidos = new ArrayList<SelectItem>();
		List<StatusPedido> lista = statusPedidoBC.findAll();
		for (StatusPedido obj: lista) {
			statusPedidos.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}

		return statusPedidos;
	}

	public void setStatusPedidos(List<SelectItem> statusPedidos) {
		this.statusPedidos = statusPedidos;
	}

	public Long getStatusPedido() {
		return statusPedido;
	}

	public void setStatusPedido(Long statusPedido) {
		this.statusPedido = statusPedido;
	}

	private Long statusPedido;

	@Inject
	private ClienteBC clienteBC;
	private List<SelectItem> clientes;
	private Long cliente;


	public List<SelectItem> getClientes() {
		clientes = new ArrayList<SelectItem>();
		List<Cliente> lista = clienteBC.findAll();
		for (Cliente obj: lista) {
			clientes.add(new SelectItem(obj.getId() , obj.getNome()));
		}
		return clientes;
	}

	public void setClientes(List<SelectItem> clientes) {
		this.clientes = clientes;
	}

	public Long getCliente() {
		return cliente;
	}

	public void setCliente(Long cliente) {
		this.cliente = cliente;
	}

	public List<SelectItem> getProdutos() {
		produtos = new ArrayList<SelectItem>();
		List<Produto> lista = produtoBC.findAll();
		for (Produto obj: lista) {
			clientes.add(new SelectItem(obj.getId() , obj.getUnidadeMedida().getSigla()  + " - " + obj.getDescricao()));
		}
		return produtos;
	}

	public void setProdutos(List<SelectItem> produtos) {
		this.produtos = produtos;
	}

	public Long getProduto() {
		return produto;
	}

	public void setProduto(Long produto) {
		this.produto = produto;
	}
	
	public Date getDataCadastroInicial() {
		return dataCadastroInicial;
	}

	public void setDataCadastroInicial(Date dataCadastroInicial) {
		this.dataCadastroInicial = dataCadastroInicial;
	}

	public Date getDataCadastroFinal() {
		return dataCadastroFinal;
	}

	public void setDataCadastroFinal(Date dataCadastroFinal) {
		this.dataCadastroFinal = dataCadastroFinal;
	}

	public Date getDataEntregaInicial() {
		return dataEntregaInicial;
	}

	public void setDataEntregaInicial(Date dataEntregaInicial) {
		this.dataEntregaInicial = dataEntregaInicial;
	}

	public Date getDataEntregaFinal() {
		return dataEntregaFinal;
	}

	public void setDataEntregaFinal(Date dataEntregaFinal) {
		this.dataEntregaFinal = dataEntregaFinal;
	}


	
	public void postProcessXLS(Object document) {
		
//		org.apache.poi.hssf.usermodel.HSSFWorkbook a;
//		org.apache.poi.ss.usermodel.Workbook b;
		
		HSSFWorkbook wb = (HSSFWorkbook) document;
		HSSFSheet sheet = wb.getSheetAt(0);
		
		/******************** HEADER **********************/		
		CellStyle headerStyle = wb.createCellStyle();
		Font headerFont = wb.createFont();
		headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		headerFont.setColor(HSSFColor.BLUE.index);
		headerStyle.setFont(headerFont);
		headerStyle.setAlignment(CellStyle.ALIGN_CENTER);
		 
		Row headerRow = sheet.getRow(0);
		int cont = 0; 
		int quantidadePulou = 0;
		for (Cell cell : headerRow) {
			cell.setCellStyle(headerStyle);

			//check	
			if (0 == cont) {
				cell.setCellValue("");
				quantidadePulou++;
			} 
			//imprimir
			if (cont ==1) {
				cell.setCellValue("");
				quantidadePulou++;
			} 
			
			if (this.exibePDF() && this.exibeExcel()) {
				if (2 == cont) {
					cell.setCellValue("");
					quantidadePulou++;
				}
				if (3 == cont) {
					cell.setCellValue("");
					quantidadePulou++;
				}
			} else if (this.exibePDF() || this.exibeExcel()) {
				if (2 == cont) {
					cell.setCellValue("");
					quantidadePulou++;
				}
			}

			if (cont == quantidadePulou) {
				cell.setCellValue("Nº Pedido");
			} else if (cont ==quantidadePulou + 1) {
				cell.setCellValue("Cliente");
			} else if (cont ==quantidadePulou + 2) {
				//cell.setCellValue("Tipo de Pagamento");
				cell.setCellValue("");
			} else if (cont ==quantidadePulou + 3) {
				cell.setCellValue("Usuário");
			} else if (cont ==quantidadePulou + 4) {
				//cell.setCellValue("Data Cadastro");
				cell.setCellValue("");
			} else if (cont ==quantidadePulou + 5) {
				cell.setCellValue("Data Previsto Entrega");
			} else if (cont ==quantidadePulou + 6) {
				cell.setCellValue("Status");
			} else if (cont ==quantidadePulou + 7) {
				cell.setCellValue("Total Pedido");
			} else if (cont ==quantidadePulou + 8) {
				//cell.setCellValue("Observação");
				cell.setCellValue("");
			}
			cont++;
		}

		for (int i = 0; i <= sheet.getLastRowNum(); i++) {
			quantidadePulou = 0;
			headerRow = sheet.getRow(i);
			if (headerRow != null) {
				cont = 0;
				
				for (Cell cell : headerRow) {
					//opcao de check
					if (0 == cont) {
						cell.setCellValue("");
						quantidadePulou++;
					}
					//botao imprimir
					if (1 == cont) {
						cell.setCellValue("");
						quantidadePulou++;
					}
					//verificando se exibe pdf ou exibe excel
					if (this.exibePDF() && this.exibeExcel()) {
						if (2 == cont) {
							cell.setCellValue("");
							quantidadePulou++;
						}
						if (3 == cont) {
							cell.setCellValue("");
							quantidadePulou++;
						}
					} else if (this.exibePDF() || this.exibeExcel()) {
						if (2 == cont) {
							cell.setCellValue("");
							quantidadePulou++;
						}
					}

					//retirando a data de cadastro
					if (quantidadePulou + 8 == cont) {
						cell.setCellValue("");
					}

					//retirando a data de cadastro
					if (quantidadePulou + 2 == cont) {
						cell.setCellValue("");
					}
					//retirando a data de cadastro
					if (quantidadePulou + 4 == cont) {
						cell.setCellValue("");
					}
					cont++;
				}
			}
		}
		
		
		/******************** TOTAL **********************/
		CellStyle style = wb.createCellStyle();
		Font font = wb.createFont();
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);
//		font.setColor(HSSFColor.ORANGE.index); 
		style.setFont(font);
		style.setAlignment(CellStyle.ALIGN_RIGHT);
		Row totalRow = sheet.createRow(sheet.getLastRowNum()+2);
		Cell cell1 = totalRow.createCell(quantidadePulou+6);
		cell1.setCellValue("Total");
		cell1.setCellStyle(style);
		Cell cell2 = totalRow.createCell(quantidadePulou+7);
		
		BigDecimal valor = BigDecimal.ZERO;
		List<Pedido> pedidos = this.getResultList();
		for (Pedido pedido : pedidos) {
			valor = valor.add(pedido.getValorTotalPedido());
		}
		
		cell2.setCellFormula(valor.toString());
		
		cell2.setCellStyle(style);

		//Ajuste do tamanho das colunas
		sheet.autoSizeColumn(0);
		sheet.autoSizeColumn(1);
		sheet.autoSizeColumn(2);
		sheet.autoSizeColumn(3);
		sheet.autoSizeColumn(4);
		sheet.autoSizeColumn(5);
		sheet.autoSizeColumn(6);
		sheet.autoSizeColumn(7);
		sheet.autoSizeColumn(8);
		sheet.autoSizeColumn(9);
		sheet.autoSizeColumn(10);
		sheet.autoSizeColumn(11);
	}
	
	public void downloadPDF() {
		try {
			gearHtml();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public String gearHtml() throws IOException, DocumentException {
		StringBuilder sb = new StringBuilder();
		sb.append("<html>");
		sb.append("	<head><title>Listagem dos Pedido </title></head>");
		sb.append("	<Body>");
		
		List<Pedido> pedidos = this.getResultList();
		
		BigDecimal valor = BigDecimal.ZERO;
		for (Pedido pedido : pedidos) {
			valor = valor.add(pedido.getValorTotalPedido());
		}
		
		
		FacesContext facesContext = FacesContext.getCurrentInstance();

		// Get HTTP response
		HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest();
		
		String contexto = request.getRequestURL().toString();
		int posicao = contexto.indexOf("/pedido_list.jsf");
		if (posicao != -1) {
			contexto = contexto.substring(0,posicao);
		}

		
		sb.append("		<table  border='0' width='600' height='40'>");
		sb.append("			<tr >");
		sb.append("				<td style='font-family:"
				+ ConfiguracaoFilter.RELATORIOS_FONT + "'  valign='top'>");
		sb.append("					<table  border='0' width='100%' height='100%'>");
		sb.append("						<tr>");
		sb.append("							<td style='font-family:"
				+ ConfiguracaoFilter.RELATORIOS_FONT + "' valign='top'>");
		String voltarUmDiretorioImagem = "";
		sb.append("								<img width='" + ConfiguracaoFilter.LOGO_WIGHT
				+ "' height='" + ConfiguracaoFilter.LOGO_HEIGTH
				+ "' border='0' src='"
				+ contexto
				+ "/images/"
				+ ConfiguracaoFilter.LOGO + "'/>");
		sb.append("							</td>");
		sb.append("						</tr>");
		sb.append("						<tr>");
		sb.append("						</tr>");
		sb.append("					</table>");
		sb.append("				</td>");
		sb.append("				<td style='font-family:"
				+ ConfiguracaoFilter.RELATORIOS_FONT
				+ "' align='center' valign='top' ><font size='"
				+ ConfiguracaoFilter.PEDIDO_FONTE_TITULO + "' > "
				+ ConfiguracaoFilter.NOME_PADARIA_RELATORIO + "</font>"
				+ "				<br/><font size='"
				+ ConfiguracaoFilter.PEDIDO_FONTE_DADOS_CLIENTE + "'>"
				+ ConfiguracaoFilter.NOME_PADARIA_RUA + "</font> ");
		if (ConfiguracaoFilter.NOME_PADARIA_CNPJ != null
				&& !"".equals(ConfiguracaoFilter.NOME_PADARIA_CNPJ.trim())) {
			sb.append("				<br/><font size='"
					+ ConfiguracaoFilter.PEDIDO_FONTE_DADOS_CLIENTE
					+ "'> " + ConfiguracaoFilter.NOME_PADARIA_CNPJ
					+ "</font> ");
		}
		sb.append("				<br/><font size='"
				+ ConfiguracaoFilter.PEDIDO_FONTE_DADOS_CLIENTE + "'>"
				+ ConfiguracaoFilter.NOME_PADARIA_FONE + "</font> "
				+ "				<br/><font size='"
				+ ConfiguracaoFilter.PEDIDO_FONTE_DADOS_CLIENTE + "'>"
				+ ConfiguracaoFilter.NOME_PADARIA_EMAIL + "</font> "
				+ "				</td>");
		sb.append("			</tr>");
		sb.append("		</table>");

		sb.append("		<br/>");
		sb.append("		<table border='0' width='600' cellspacing='0' cellpadding='0'>");

		String tipoPagamento = "Todos";
		if (this.getTipoPagamento() != null && (this.getTipoPagamento().equals(Cliente.TIPO_PAGAMENTO_A_VISTA))) {
			tipoPagamento = "A Vista";
		} else if (this.getTipoPagamento() != null && (this.getTipoPagamento().equals(Cliente.TIPO_PAGAMENTO_FATURADO))) {
			tipoPagamento = "Faturado";
		} 

		sb.append("			<tr>");
		sb.append("				<td cospan='2' style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' width='33%' ><font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "'  ><strong>Tipo de Pagamento: </strong>  " + tipoPagamento + "</font></td>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' width='33%' ><font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "'  ><strong>Data Relatório: </strong>  " + Util.dateToString(new Date()) + "</font></td>");
		sb.append("			</tr>");


		String dataInicial = "";
		if (getDataEntregaInicial() != null) {
			dataInicial = Util.dateToString(getDataEntregaInicial());
		}
		String dataFinal = "";
		if (getDataEntregaFinal() != null) {
			dataFinal = Util.dateToString(getDataEntregaFinal());
		}

		sb.append("			<tr>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' width='33%' ><font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "'  ><strong>Data Inicial de Entrega: </strong>  " + dataInicial+ "</font></td>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' width='33%' ><font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "'  ><strong>Data Final de Entrega: </strong>  " + dataFinal + "</font></td>");
		sb.append("			</tr>");

		sb.append("			<tr>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' width='33%' ><font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "'  ><strong>Valor Total :</strong> " + Util.formataValorParaString(valor, 2) + "</font></td>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' width='33%' ><font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "'  ><strong>Quantidade de Pedidos: </strong> " + pedidos.size() + "</font></td>");
		sb.append("			</tr>");

		sb.append("		</table>");
		sb.append("		<br/>");

		sb.append("		<table border='1' cellspacing='0' cellpadding='1'  width='600' height='40'>");
		sb.append("			<tr bgcolor='AAAAAA'>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' align='center'> <font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL +  "' ><strong>Codigo</strong></font></td>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' align='center'> <font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' ><strong>Cliente</strong></font></td>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' align='center'> <font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' ><strong>Tipo de Pagamento</strong></font></td>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' align='center'> <font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' ><strong>Usuario</strong></font></td>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' align='center'> <font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' ><strong>Data de Entrega</strong></font></td>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' align='center'> <font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' ><strong>Status do Pedido</strong></font></td>");
		sb.append("				<td style='font-family:" + ConfiguracaoFilter.RELATORIOS_FONT + "' align='center'> <font size='" + ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' ><strong>Valor Total</strong></font></td>");
		sb.append("			</tr>");
		
		for (Pedido pedido : pedidos) {
			sb.append("			<tr>");
			sb.append("				<td style='font-family:"
					+ ConfiguracaoFilter.RELATORIOS_FONT
					+ "'> <font size='"
					+ ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' >"
					+pedido.getId() + "</font></td>");
			sb.append("				<td style='font-family:"
					+ ConfiguracaoFilter.RELATORIOS_FONT
					+ "'> <font size='"
					+ ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' >"
					+pedido.getCliente().getNome()  + "</font></td>");
			sb.append("				<td style='font-family:"
					+ ConfiguracaoFilter.RELATORIOS_FONT
					+ "'> <font size='"
					+ ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' >"
					+ ((pedido.getCliente().getTipoPagamento() != null && pedido.getCliente().getTipoPagamento().equals(Cliente.TIPO_PAGAMENTO_A_VISTA))? "A Vista":"Faturado")+ "</font></td>");
			sb.append("				<td style='font-family:"
					+ ConfiguracaoFilter.RELATORIOS_FONT
					+ "'> <font size='"
					+ ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' >"
					+ pedido.getUsuario().getNome() + "</font></td>");
			sb.append("				<td style='font-family:"
					+ ConfiguracaoFilter.RELATORIOS_FONT
					+ "'> <font size='"
					+ ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' >"
					+ Util.dateToString(pedido.getDataEntrega()) + "</font></td>");
			sb.append("				<td style='font-family:"
					+ ConfiguracaoFilter.RELATORIOS_FONT
					+ "' align='center'> <font size='"
					+ ConfiguracaoFilter.PEDIDO_FONTE_GERAL + "' >"
					+ pedido.getStatusPedido().getDescricao()
					+ "</font></td>");
			sb.append("				<td style='font-family:"
					+ ConfiguracaoFilter.RELATORIOS_FONT
					+ "' align='center'> <font size='"
					+ ConfiguracaoFilter.PEDIDO_FONTE_GERAL
					+ "' >"
					+ Util.formataValorParaString(pedido.getValorTotalPedido(), 2)
					+ "</font></td>");
			sb.append("			</tr>");
		}
		sb.append("		</table>");
		
		sb.append("		<br/>");

		sb.append("</Body>");
		sb.append("</html>");
		
		String html = sb.toString();
		String nova = "<br/>";

		String antiga = "<BR>";
		int index = html.indexOf(antiga);
		while (index != -1) {
			String antes = html.substring(0,index);
			String depois = html.substring(index + antiga.length(), html.length());
			html = antes + nova + depois;
			index = html.indexOf(antiga);
		}
		antiga = "<br>";
		index = html.indexOf(antiga);
		while (index != -1) {
			String antes = html.substring(0,index);
			String depois = html.substring(index + antiga.length(), html.length());
			html = antes + nova + depois;
			index = html.indexOf(antiga);
		}
		
		String diretorioLogo = Util.dirCorrente() + "/images/" + ConfiguracaoFilter.LOGO;

		File fnew = new File(diretorioLogo);
		BufferedImage originalImage = ImageIO.read(fnew);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ImageIO.write(originalImage, "jpg", baos);
		byte[] imageInByte = baos.toByteArray();

		
		ByteArrayOutputStream bOut = new ByteArrayOutputStream();
		PdfUtils.generatePDF(html, bOut, imageInByte);
		bOut.close();
		
		
		
		

		// Get HTTP response
		HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();

		// Set response headers
		response.reset(); // Reset the response in the first place
//		response.setHeader("Content-Type", "application/pdf"); // Set only the
																// content type
		
		response.setHeader("Content-disposition",
				"attachment; filename=listaPedidoPdf.pdf");

		// Open response output stream
		OutputStream responseOutputStream = response.getOutputStream();

		// // Read PDF contents and write them to the output
		// byte[] bytesBuffer = new byte[2048];
		// int bytesRead;
		// while ((bytesRead = pdfInputStream.read(bytesBuffer)) > 0) {
		responseOutputStream.write(bOut.toByteArray());
		// }

		// Make sure that everything is out
		responseOutputStream.flush();

		// Close both streams
		// pdfInputStream.close();
		responseOutputStream.close();

		// JSF doc:
		// Signal the JavaServer Faces implementation that the HTTP response for
		// this request has already been generated
		// (such as an HTTP redirect), and that the request processing lifecycle
		// should be terminated
		// as soon as the current phase is completed.
		facesContext.responseComplete();
		
		return sb.toString();
	}
	
	public void filtrar() {
		super.clear();
		super.getDataModel();
		filtrar = true;

	}
	
	@Override
	protected List<Pedido> handleResultList() {
		
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();    
		request.getParameter("idPedido");
		
		Long idPedido = (Long) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("idPedidos");
		if(idPedido != null) {
			FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("idPedidos", null);
			filtrar = true;
			this.setIdPedido(idPedido);
		}
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("pedidos", null);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("pedido", null);

		if (filtrar) {
			this.setStatusPedido(null);
			this.setCliente(null);
			setDataCadastroInicial(null);
			setDataCadastroFinal(null);
			setDataEntregaInicial(null);
			setDataEntregaFinal(null);
			setDataEntregaInicial(null);
			setTipoPagamento(null);
			setDataEntregaFinal(null);
			setIdPedido(idPedido);
			boolean admin = false;
			ContextoUsuario usuario = (ContextoUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ConstantesMensagem.CONTEXTO_USUARIO_SESSAO);
			if (usuario != null) {
				for (Perfil perfil :usuario.getUsuario().getListaPerfil()) {
					if (perfil.getId().equals(Perfil.PERFIL_ADM)){
						admin = true;
					}
				}
				
			}
			
			
			if (request.getParameter("statusPedido") != null && !"".equals(request.getParameter("statusPedido")))
				this.setStatusPedido(new Long(request.getParameter("statusPedido")));

			if (!admin) {
				this.setUsuario(usuario.getUsuario().getId());
			} else {
				if (request.getParameter("usuario") != null && !"".equals(request.getParameter("usuario")))
					this.setUsuario(new Long(request.getParameter("usuario")));
			}
			
			if (request.getParameter("idPedido") != null && !"".equals(request.getParameter("idPedido")))	{
				try {
					this.setIdPedido(new Long(request.getParameter("idPedido")));
				} catch (Exception e) {
					this.setIdPedido(new Long(0));
				}
			}

			if (request.getParameter("cliente") != null && !"".equals(request.getParameter("cliente")))	
				this.setCliente(new Long(request.getParameter("cliente")));

			if (request.getParameter("tipoPagamento") != null && !"".equals(request.getParameter("tipoPagamento"))) {
				try {
					this.setTipoPagamento(new Byte(request.getParameter("tipoPagamento")));
				} catch (Exception e) {}
			} else  if (request.getParameter("tipoPagamento_input") != null && !"".equals(request.getParameter("tipoPagamento_input"))) {
				try {
					this.setTipoPagamento(new Byte(request.getParameter("tipoPagamento_input")));
				} catch (Exception e) {}
			}
			
			if (request.getParameter("dataCadastroInicial_input") != null && !"".equals(request.getParameter("dataCadastroInicial_input")))	{
				setDataCadastroInicial(DateConverter.getDate(request.getParameter("dataCadastroInicial_input")));
			}

			if (request.getParameter("dataCadastroFinal_input") != null && !"".equals(request.getParameter("dataCadastroFinal_input")))	{
				setDataCadastroFinal(DateConverter.getDate(request.getParameter("dataCadastroFinal_input")));
			}

			if (request.getParameter("dataEntregaInicial_input") != null && !"".equals(request.getParameter("dataEntregaInicial_input")))	{
				setDataEntregaInicial(DateConverter.getDate(request.getParameter("dataEntregaInicial_input")));
			}

			if (request.getParameter("dataEntregaFinal_input") != null && !"".equals(request.getParameter("dataEntregaFinal_input")))	{
				setDataEntregaFinal(DateConverter.getDate(request.getParameter("dataEntregaFinal_input")));
			}

			Byte tipoPG = this.getTipoPagamento();
			if (tipoPG != null && tipoPG.equals(TIPO_PAGAMENTO_TODOS)) {
				tipoPG = null;
			}

			List<Pedido> pedidos = this.pedidoBC.consultarPedidos(null, this.idPedido, this.cliente, this.usuario, this.statusPedido, null, this.dataCadastroInicial, this.dataCadastroFinal, this.dataEntregaInicial, this.dataEntregaFinal, null, tipoPG);

			FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("pedidos", pedidos);

			return pedidos;
		}
		
		return new ArrayList<Pedido>();
	}
	
	@Inject
	private FacesContext facesContext;
	
	@Inject
	private ResourceBundle bundle;

	public String deleteSelection() {
		boolean delete;
		
		List<Long> ids = new ArrayList<Long>();
		for (Iterator<Long> iter = getSelection().keySet().iterator(); iter.hasNext();) {
			Long id = iter.next();
			delete = getSelection().get(id);
			if (delete) {
				ids.add(id);
				iter.remove();
			}
		}
		
		try {
			pedidoBC.delete(ids);
		} catch (Exception e) {
			facesContext.addMessage(null, new FacesMessage(bundle.getString(ConstantesMensagem.ERRO_REMOVER)));
		}				

		return getPreviousView();
	}
	
	public void carregarPedido() {
		if (this.getIdPedido() != null)  {
			Pedido pedido = pedidoBC.load(this.getIdPedido());
			FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("pedido", pedido);
		}
	}

	public Byte getTipoPagamento() {
		return tipoPagamento;
	}

	public void setTipoPagamento(Byte tipoPagamento) {
		this.tipoPagamento = tipoPagamento;
	}

	public String getModeloFormularioPedido() {
		return ConfiguracaoFilter.MODELO_PEDIDO;
	}

	public boolean exibePDF() {
		return ConfiguracaoFilter.PEDIDO_LISTAGEM_EXIBE_PDF  ==  1;
	}
	public boolean exibeExcel() {
		boolean retorno = false;
		ContextoUsuario usuario = (ContextoUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ConstantesMensagem.CONTEXTO_USUARIO_SESSAO);
		if (usuario != null && usuario.getUsuario().getIndicadorPedidoExecel().equals(ObjetoAbstrato.SIM)) {
			retorno = true;
		}

		return retorno && ConfiguracaoFilter.PEDIDO_LISTAGEM_EXIBE_EXCEL == 1;
	}
}